home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Oberon / HangUp.mod < prev    next >
Text File  |  1996-07-06  |  5KB  |  224 lines

  1. MODULE HangUp;
  2.  
  3.     IMPORT
  4.     a:= Arguments, ac:= ANSIConsole, st:= Strings, cv:= Conversions, io, s:= SYSTEM,
  5.     e:= Exec, d:= Dos, ol:= OberonLib,
  6.     bo:= BBSColours, bs:= BBSStructures, bc:= BBSConstants,
  7.     hn:= HBBSNode, hc:= HBBSCommon, req:= Requests;
  8.  
  9.     CONST EOF = -1; LF = 0AH;
  10.       LineLength = 80;
  11.  
  12.     TYPE
  13.     LineNodePtr = UNTRACED POINTER TO LineNode;
  14.     LineNode = STRUCT
  15.         prev, next: LineNodePtr;
  16.         text: ARRAY LineLength OF CHAR;
  17.     END;
  18.  
  19.     VAR
  20.     BBSGlobal: bs.BBSGlobalDataPtr;
  21.     NnD: bs.NodeDataPtr;
  22.     argList: LineNodePtr;
  23.     argsPool: e.MemPoolPtr;
  24.     CountArgs: INTEGER;
  25.     NodeNum: LONGINT;
  26.  
  27.     PROCEDURE cleanup(num: LONGINT);
  28.     BEGIN
  29.     IF hn.HBBSNodeBase # NIL THEN
  30.         (* req.BreakPoint("CleanUpDoor"); *)
  31.         hn.HBBSCleanUpDoor;
  32.         (* req.BreakPoint("Close HBBSNodeBase"); *)
  33.         e.CloseLibrary(hn.HBBSNodeBase);
  34.         hn.HBBSNodeBase:= NIL;
  35.     END;
  36.     IF hc.HBBSCommonBase # NIL THEN
  37.         (* req.BreakPoint("CleanUpCommon"); *)
  38.         hc.HBBSCleanUpCommon;
  39.         (* req.BreakPoint("Close HBBSCommonBase"); *)
  40.         e.CloseLibrary(hc.HBBSCommonBase);
  41.         hc.HBBSCommonBase:= NIL;
  42.     END;
  43.  
  44.     IF num # 0 THEN
  45.         io.WriteString("Door Error = ");
  46.         io.WriteInt(num, 0); io.WriteLn;
  47.          (* io.Format("Door Error = %d\n", s.ADR(num)) *)
  48.     END;
  49.     (* req.BreakPoint("Bye bye"); *)
  50.     END cleanup;
  51.  
  52.     PROCEDURE init(name: e.STRPTR);
  53.     BEGIN
  54.     
  55.     (* req.BreakPoint("HBBSCommonBase"); *)
  56.     IF hc.HBBSCommonBase = NIL THEN
  57.         cleanup(1); RETURN
  58.     END;
  59.     (* req.BreakPoint("HBBSInitCommon"); *)
  60.     IF NOT hc.HBBSInitCommon() THEN
  61.         cleanup(2); RETURN
  62.     END;
  63.     (* req.BreakPoint("HBBSNodeBase"); *)
  64.     IF hn.HBBSNodeBase = NIL THEN
  65.         cleanup(3); RETURN
  66.     END;
  67.     (* req.BreakPoint("HBBSInitDoor"); *)
  68.     IF NOT hn.HBBSInitDoor(SHORT(NodeNum), name) THEN
  69.         cleanup(4); RETURN
  70.     END;
  71.  
  72.     END init;
  73.  
  74.     PROCEDURE AddNode(VAR list: LineNodePtr; at: INTEGER): LineNodePtr;
  75.     VAR last, new: LineNodePtr;
  76.         dummy: LineNode;
  77.     BEGIN
  78.     new:= e.AllocPooled(argsPool, s.SIZE(dummy));
  79.     IF list = NIL THEN
  80.         IF new # NIL THEN
  81.         new^.prev:= NIL;
  82.         new^.next:= NIL;
  83.         END;
  84.         list:= new;
  85.     ELSE
  86.         IF at <= 1 THEN
  87.         IF new # NIL THEN
  88.             new^.prev:= NIL;
  89.             new^.next:= list;
  90.             list^.prev:= new;
  91.             list:= new;
  92.         END;
  93.         ELSE
  94.         last:= list;
  95.         WHILE (last^.next # NIL) & (at > 2) DO
  96.             last:= last^.next; at:= at - 1
  97.         END;
  98.         IF new # NIL THEN
  99.             new^.next:= last^.next;
  100.             new^.prev:= last;
  101.             IF last^.next # NIL THEN
  102.             last^.next^.prev:= new
  103.             END;
  104.             last^.next:= new;
  105.         END;
  106.         END;
  107.     END;
  108.     RETURN new;
  109.     END AddNode;
  110.  
  111.     PROCEDURE DeleteNode(VAR list: LineNodePtr; at: INTEGER);
  112.     VAR this: LineNodePtr;
  113.         dummy: LineNode;
  114.     BEGIN
  115.     IF list # NIL THEN
  116.         this:= list;
  117.         IF at <= 1 THEN
  118.         list:= this^.next;
  119.         IF list # NIL THEN list^.prev:= NIL END;
  120.         ELSE
  121.         WHILE (this^.next # NIL) & (at > 1) DO
  122.             this:= this^.next; at:= at - 1
  123.         END;
  124.         IF this^.prev # NIL THEN
  125.             this^.prev^.next:= this^.next
  126.         END;
  127.         IF this^.next # NIL THEN
  128.             this^.next^.prev:= this^.prev;
  129.         END;
  130.         END;
  131.         e.FreePooled(argsPool, this, s.SIZE(dummy));
  132.     END;
  133.     END DeleteNode;
  134.  
  135.     PROCEDURE GetNode(list: LineNodePtr; at: INTEGER): LineNodePtr;
  136.     BEGIN
  137.     IF list = NIL THEN RETURN NIL END;
  138.     WHILE (list # NIL) & (at > 1) DO
  139.         list:= list^.next; at:= at - 1;
  140.     END;
  141.     RETURN list;
  142.     END GetNode;
  143.  
  144.     PROCEDURE ReqNumber(l: LONGINT);
  145.     VAR str: ARRAY 80 OF CHAR;
  146.         ok: BOOLEAN;
  147.     BEGIN
  148.     ok:= cv.IntToString(l, str, 10);
  149.     IF ok THEN
  150.         req.BreakPoint(str)
  151.     END;
  152.     END ReqNumber;
  153.  
  154.     PROCEDURE PutNumber(l: LONGINT);
  155.     VAR str: ARRAY 80 OF CHAR;
  156.         ok: BOOLEAN;
  157.     BEGIN
  158.     ok:= cv.IntToString(l, str, 10);
  159.     IF ok THEN
  160.         hn.PutText(s.ADR(str));
  161.     END;
  162.     END PutNumber;
  163.  
  164.     PROCEDURE DoorMain;
  165.     BEGIN
  166.     hn.DOORHangUp; (* send ATH0 to force logoff *)
  167.     hn.DOORGoodBye;  
  168.     END DoorMain;
  169.  
  170.     PROCEDURE ParseArgs;
  171.     VAR
  172.         i: INTEGER;
  173.         newArg: LineNodePtr;
  174.         s: ARRAY 80 OF CHAR;
  175.         ok: BOOLEAN;
  176.     BEGIN
  177.     CountArgs:= a.NumArgs();
  178.     i:= 1;
  179.     WHILE i <= CountArgs DO
  180.         newArg:= AddNode(argList, MAX(INTEGER));
  181.         IF newArg # NIL THEN
  182.         a.GetArg(i, newArg^.text);
  183.         ELSE
  184.         CountArgs:= i;
  185.         END;
  186.         i:= i + 1
  187.     END;
  188.     END ParseArgs;
  189.  
  190.      VAR
  191.      dummy: LineNode;
  192.      nodeNumArg: LineNodePtr;
  193.  
  194. BEGIN
  195.     argsPool:= e.CreatePool(LONGSET{}, s.SIZE(dummy), s.SIZE(dummy));
  196.     ParseArgs;
  197.     IF CountArgs > 0 THEN
  198.     nodeNumArg:= GetNode(argList, 1);
  199.     IF nodeNumArg # NIL THEN
  200.         IF cv.StringToInt(nodeNumArg^.text, NodeNum) THEN
  201.         init(s.ADR("Logging Off"));
  202.         IF hc.HBBSCommonBase # NIL THEN
  203.             BBSGlobal:= hc.HBBSGimmeBBS();
  204.             IF BBSGlobal # NIL THEN
  205.             NnD:= hc.HBBSNodeDataPtr(SHORT(NodeNum));
  206.             IF NnD # NIL THEN
  207.                 DoorMain;
  208.             END;
  209.             END;
  210.         END;
  211.         END;
  212.         cleanup(0);
  213.     ELSE
  214.         io.WriteString("Invalid Param for door")
  215.     END;
  216.     ELSE
  217.     io.WriteString("Invalid / No param for door")
  218.     END;
  219. CLOSE
  220.     cleanup(0);
  221.     e.DeletePool(argsPool);
  222. END HangUp.
  223.  
  224.